// 指针

package main

import (
	"fmt"
)

func main() {
	base()
	fmt.Println("-------")

	base2()
	fmt.Println("-------")

	visit()
	fmt.Println("-------")

	var arr = []int{1, 2, 3, 4, 5, 6}

	// 数组指针，需指定数组大小
	var ptrArr [6]*int
	ptrArr[0] = &arr[0]
	ptrArr[1] = &arr[1]
	fmt.Println(*ptrArr[0], *ptrArr[1])

	fmt.Println("-------")
	// 指向指针的指针

	var a int
	var ptr *int
	var pptr **int

	a = 3000

	/* 指针 ptr 地址 */
	ptr = &a

	/* 指向指针 ptr 地址 */
	pptr = &ptr

	/* 获取 pptr 的值 */
	fmt.Printf("变量 a = %d\n", a)
	fmt.Printf("指针变量 *ptr = %d\n", *ptr)
	fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)

	// 指针的打印
	printf()
}

type flyable interface {
	fly()
}
type bird struct {
	id int
}

func (b *bird) fly() {
	fmt.Println("bird can fly")
}

func base() {
	var num = 666
	var ptrNum *int
	ptrNum = &num
	fmt.Println("ptrNum:", ptrNum)
	fmt.Println("*ptrNum:", *ptrNum)
	*ptrNum = 888
	fmt.Println("num:", num)
	*ptrNum++
	fmt.Println("num:", num)
}

func base2() {
	b1 := bird{id: 1}
	b2 := bird{id: 2}
	b3 := bird{id: 3}
	var ptr *bird
	ptr = &b1
	fmt.Printf("ptr=%v  b1=%v b2=%v b3=%v \n", *ptr, b1, b2, b3)
	ptr = &b2
	fmt.Printf("ptr=%v  b1=%v b2=%v b3=%v \n", *ptr, b1, b2, b3)
	// *ptr，修改了对应数据的内容，也即b2被修改了
	*ptr = b3
	fmt.Printf("ptr=%v  b1=%v b2=%v b3=%v \n", *ptr, b1, b2, b3)
}

// 访问成员变量
func visit() {
	b := bird{id: 1}
	ptr := &b

	var id int
	id = ptr.id
	fmt.Println(id)
	id = (*ptr).id
	fmt.Println(id)
}

func printf() {
	var a int = 10
	var b *int = &a
	fmt.Printf("int %p %p \n", &a, b)

	var arr = [3]int{1, 2, 3}
	var slice = []int{1, 2, 3}
	var dic = make(map[string]string)
	fmt.Printf("arr %p  slice %p  dic %p \n", &arr, slice, dic)

	var _bird = bird{}
	var _flyable flyable = &_bird
	fmt.Printf("interface %p  struct %p \n", _flyable, &_bird)
}
